ARM指令详解之Load/Store指令

您所在的位置:网站首页 汇编MOVE Q ARM指令详解之Load/Store指令

ARM指令详解之Load/Store指令

2023-08-19 06:06| 来源: 网络整理| 查看: 265

Load/Store指令 Load/Store指令用于寄存器和内存间数据的传送。 Load 用于把内存中的数据装载到寄存器中。 Store用于把寄存器中的数据存入内存。 该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。 Load/Store指令分为3类: (1)单一数据传送指令(LDR和STR等) (2)多数据传送指令(LDM和STM) (3)数据交换指令(SWP和SWPB) Load/Store指令1-1 1.LDR 字数据加载指令 格式:LDR{} ,; 功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。 地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。 寻址方式: Rn:基址寄存器。 Rm:变址寄存器。 Index:偏移量,12位的无符号数。 LDR Rd,[Rn] ;把内存中地址为Rn的字数据装入寄存器Rd中 LDR Rd,[Rn,Rm] ;将内存中地址为Rn+Rm的字数据装入寄存器Rd中 Load/Store指令1-2 LDR Rd,[Rn,#index] ;将内存中地址为Rn+index的字数据装入Rd中 LDR Rd,[Rn,Rm,LSL#5] ;将内存中地址为Rn+Rm×32的字数据装入Rd LDR Rd,[Rn,Rm] ! ;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn LDR Rd,[Rn,#index] ! ;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入Rn LDR Rd,[Rn,Rm,LSL#5]! ;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入Rn Load/Store指令1-3 LDR Rd,[Rn],Rm ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn LDR Rd,[Rn],#index;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn LDR Rd,[Rn],Rm,LSL#5 ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn 例如: LDR R0,[R1,R2,LSL#5]! ; 将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1 Load/Store指令2 LDRB 字节数据加载指令 格式:LDR{}B ,; 功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。 例如: LDRB R0,[R1] ;将内存中起始地址为R1的一个字节数据装入R0中 Load/Store指令3 3.LDRBT 用户模式的字节数据加载指令 格式:LDR{}BT ,; 功能:同LDRB指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。 Load/Store指令4 4.LDRH 半字数据加载指令 格式:LDR{}H ,; 功能:同LDR指令,但该指令只是从内存读取一个16位的半字数据而不是一个32位的字数据,并将Rd的高16位清0。 例如: LDRH R0,[R1] ;将内存中起始地址为R1的一个半字数据装入R0中 Load/Store指令5 5.LDRSB 有符号的字节数据加载指令 格式:LDR{}SB ,; 功能:同LDRB指令,但该指令将寄存器Rd的高24位设置成所装载的字节数据符号位的值。 例如: LDRSB R0,[R1] ;将内存中起始地址为R1的一个字节数据装入R0中,R0的高24位设置成该字节数据的符号位 Load/Store指令6 6.LDRSH 有符号的半字数据加载指令 格式:LDR{}SH ,; 功能:同LDRH指令,但该指令将寄存器Rd的高16位设置成所装载的半字数据符号位的值。 例如: LDRSH R0,[R1] ;将内存中起始地址为R1的一个16位半字数据装入R0中,R0的高16位设置成该半字数据的符号位 Load/Store指令7 7.LDRT 用户模式的字数据加载指令 格式:LDR{}T ,; 功能:同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。 addr所表示的有效地址必须是字对齐的,否则从内存中读出的数值需进行循环右移操作。 Load/Store指令8 8.STR 字数据存储指令 格式:STR{} ,; 功能:把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。 地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。 寻址方式同LDR指令。 例如: STR R0,[R1,#5]! ;把R0中的字数据保存到以R1+5为地址的内存中,然后R1=R1+5   STR指令应用举例 STR指令应用举例Load/Store指令9 9.STRB 字节数据存储指令 格式:STR{}B ,; 功能:把寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中。 其他用法同STR指令。 例如: STRB R0,[R1] ;将寄存器R0中的低8位数据存入R1表示的内存地址中 Load/Store指令10 10.STRBT 用户模式的字节数据存储指令 格式:STR{}BT ,; 功能:同STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。 Load/Store指令11 11.STRH 半字数据存储指令 格式:STR{}H ,; 功能:把寄存器Rd中的低16位半字数据保存到addr所表示的内存地址中,而且addr所表示的地址必须是半字对齐的。 其他用法同STR指令。 例如: STRH R0,[R1] ;将寄存器R0中的低16位数据存入R1表示的内存地址中 存储格式对于加载/存储指令的影响 Load/Store指令12 12.STRT 用户模式的字数据存储指令 格式:STR{}T ,; 功能:同STR指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。 Load/Store指令13-1 13.LDM 批量数据加载指令 格式: LDM{}{} {!},{^}; 功能:从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。 该指令一般用于多个寄存器数据的出栈。 type字段种类: IA:每次传送后地址加1。 IB:每次传送前地址加1。 DA:每次传送后地址减1。 DB:每次传送前地址减1。 FD:满递减堆栈。 ED:空递减堆栈。 FA:满递增堆栈。 EA:空递增堆栈。

注意:有一个约定,编号低的寄存器在存储数据或者加载数据时对应于存储器的低地址。

Load/Store指令13-2 例如 LDMIA/IB/DA/DB R13!,{R0-R1,R3}; 各指令执行完后,结果如图所示。 Load/Store指令13-4 FD、ED、FA和EA指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址。 一个满栈的栈指针指向上次写的最后一个数据单元. 空栈的栈指针指向第一个空闲单元。 一个降序栈是在内存中反向增长而升序栈在内存中正向增长。 Load/Store指令13-5 格式: LDM{}{} {!},{^}; {!}:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器。 {^}:当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模式下的寄存器,否则指示指令执行时,将寄存器SPSR的值复制到CPSR中。 Load/Store指令14-1 14.STM 批量数据存储指令 格式:STM{}{} {!},{^}; 功能:将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。 该指令一般用于多个寄存器数据的入栈。 {^}:指示指令所用的寄存器为用户模式下的寄存器。 其他参数用法同LDM指令。 例如: STMEA R13!,{R0-R12,PC} ;将寄存器R0~R12以及程序计数器PC的值保存到R13指示的堆栈中 Load/Store指令14-2 举例:其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址寄存器 Load/Store指令14-3 堆栈操作和数据块传送指令类似,也有4种模式,它们之间的关系如下表所示: Load/Store指令15 15.SWP 字数据交换指令 格式:SWP{} ,,[]; 功能: Rd=[op2],[op2]=op1 从op2所表示的内存装载一个字并把这个字放置到目的寄存器Rd中,然后把寄存器op1的内容存储到同一内存地址中。 op1,op2均为寄存器。 例如: SWP R0,R1,[R2] ;将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中 Load/Store指令16 16.SWPB 字节数据交换指令 格式:SWP{}B ,,[]; 功能:从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0;然后将寄存器op1的低8位数据存储到同一内存地址中。 例如: SWPB R0,R1,[R2] ;将R2所表示的内存单元中的一个字节数据装载到R0的低8位,然后将R1中的低8位字节数据保存到R2所表示的内存单元中 程序状态寄存器指令 用于状态寄存器和通用寄存器间传送数据。 总共有两条指令:MRS和MSR。 两者结合可用来修改程序状态寄存器的值。 程序状态寄存器指令1 1.MRS 程序状态寄存器到通用寄存器的数据传送指令 格式:MRS{} ,CPSR/SPSR; 功能:用于将程序状态寄存器的内容传送到目标寄存器Rd中。 当进入中断服务程序或进程切换时,该指令可用来保存当前状态寄存器的值。 例如: MRS R0,CPSR ;状态寄存器CPSR的值存入寄存器R0中 程序状态寄存器指令2 2.MSR 通用寄存器到程序状态寄存器的数据传送指令 格式:MSR{} CPSR/SPSR_,; 功能:用于将寄存器Rd的值传送到程序状态寄存器中。 当退出中断服务程序或进程切换时,该指令可用来恢复状态寄存器的值。 操作数op1可以是通用寄存器或立即数。 :用来设置状态寄存器中需要操作的位。 32位的状态寄存器可以分为4个域: 位[31:24]为条件标志位域,用f表示。 位[23:16]为状态位域,用s表示。 位[15:8]为扩展位域,用x表示。 位[7:0]为控制位域,用c表示。 例如:MSR CPSR_f,R0 ;用R0的值修改CPSR的条件标志域 MSR CPSR_fsxc,#5; CPSR的值修改为5 协处理器指令 ARM处理器最多可支持16个协处理器,用于辅助ARM完成各种协处理操作。 在程序执行过程中,各协处理器只执行自身的协处理指令,而忽略属于ARM处理器和其他协处理器的指令。 ARM协处理器指令可分为3类: (1)ARM处理器用于初始化协处理器的数据操作指令(CDP)。 (2)协处理器寄存器和内存单元之间的数据传送指令(LDC,STC)。 (3)ARM处理器寄存器和协处理器寄存器之间的数据传送指令(MCR,MRC)。 CDP协处理器操作指令 格式:CDP{}

,,,,,; 功能:用于传递指令给协处理器p,要求其在寄存器CRn和CRm上,进行操作opcode1,并把结果存放到CRd中,可以使用opcode2提供与操作有关的补充信息。 指令中的所有寄存器均为协处理器的寄存器,操作由协处理器完成。 指令中: P为协处理器编号; CRd为目的寄存器的协处理器寄存器; CRm和CRn为存放操作数的协处理器寄存器; Opcode1和opcode2为协处理器即将执行的操作。 例如:CDP p5,5,c0,c1,c2,9; 该指令用于通知协处理器p5,在c1和c2上执行操作5和9,并将结果存放到c0中。 LDC协处理器数据读取指令 格式:LDC {}{L}

,,; 功能:将addr表示的内存地址中的连续数据传送到目的寄存器CRd中。 L表示指令为长读取操作,比如用于双精度数据的传输; 目的寄存器CRd为协处理器的寄存器; addr的寻址方式同LDR指令,其寄存器为ARM处理器的寄存器。 例如: LDC p5,c1,[R1+5]:该指令用于将R1+5所对应的存储单元中的数据,传送到协处理器p5的寄存器c1中。 STC协处理器数据存储指令 格式:STC{}{L}

,,; 功能:将寄存器CRd的值传送到addr表示的内存地址中。指令中各参数用法同LDC。 例如:STC p5,c1,[R1+5]; 该指令用于将协处理器p5中寄存器c1的数据传送到R1+5所对应的存储单元中。 MCR ARM寄存器到协处理器寄存器的数据传送指令 格式:MCR{}

,,,,{,op2}; 功能:将ARM处理器的寄存器Rd中的数据传送到协处理器p的寄存器CRn,CRm中;op1,op2为协处理器将要执行的操作。 例如:MCR p5,5,R1,C1,C2,9;该指令将R1中的数据传送到协处理器p5的寄存器C1,C2中,协处理器执行操作5和9。 MRC 协处理器寄存器到ARM寄存器的数据传送指令 格式:MRC {}

,,,,{,op2}; 功能:将协处理器p的寄存器CRn,CRm的数据传送到ARM处理器的寄存器Rd中;op1,op2为协处理器将要执行的操作。 例如:MRC p5,5,R1,C1,C2,9;该指令将寄存器C1,C2中的数据传送到R1中,协处理器p5协处理器执行操作5和9。 异常中断指令1 1.SWI 软件中断指令 格式:SWI {} 24位的立即数; 功能:用于产生软件中断,以使用户程序调用操作系统的系统例程。 指令中24位的立即数指定用户程序调用系统例程的类型,其参数通过通用寄存器传递。 当24位的立即数被忽略时,系统例程类型由寄存器R0指定,其参数通过其他通用寄存器传递。 例如: SWI 0X05; 调用编号为05的系统例程。 异常中断指令3 2.BKPT 断点中断指令 格式:BKPT 16位的立即数; 功能:用于产生软件断点中断,以便软件调试时使用。16位的立即数用于保存软件调试中额外的断点信息。 指令操作的伪代码: if (not overdiden by debug hardware) then R14_abt = adderss of BKPT instruction + 4 SPSR_abt = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 CPSR[7] = 1 if high vectors configured then PC = 0xFFFF000C else PC = 0x0000000C



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3